package com.tensquare.manager.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;

@Component
public class WebFilter extends ZuulFilter {
    @Autowired
    private JwtUtil jwtUtil;


    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 管理后台(管理员使用)过滤器实现token校验
     *
     * 网关过滤器转发的时候,只会按照标准的HTTP协议,我们在前端
     * 自己添加的http头(Authorization头)并不会转发
     * 所以我们要在过滤器这里将自己添加的Authorization头信息,添加到转发后的请求中
     */
    @Override
    public Object run() throws ZuulException {
        //获取RequestContext
        RequestContext requestContext = RequestContext.getCurrentContext();
        //获取原生Request对象
        HttpServletRequest request = requestContext.getRequest();
        if (request.getMethod().equals("OPTIONS")) {
            //zuul网关内部交换的一个方法,直接放行即可
            //直接放行OPTIONS方式的请求
            return null;
        }
        //提取请求地址
        String url = request.getRequestURI().toString();
        if (url.indexOf("/admin/login") > 0) {
            //判断如果是登录页面 => 直接放行,不需要检验管理员权限
            System.out.println("登录页面"+url);
            return null;
        }
        //获取请求中的JwtToken
        //获取头信息
        String authorization = request.getHeader("Authorization");
        //检验token不为空,以及是Bearer 开头
        if (authorization != null && authorization.startsWith("Bearer ")) {
            //提取token
            String token = authorization.substring(7);
            //解析token => 提取载荷
            Claims claims = jwtUtil.parserToken(token);
            if (claims != null) {
                //提取载荷中的用户角色,并判断是否为管理员
                if ("admin".equals(claims.get("role"))) {
                    //是管理员 => 转发请求到微服务,并携带Authorization头信息
                    requestContext.addZuulRequestHeader("Authorization",authorization);
                    System.out.println("token验证通过,并添加头信息"+authorization);
                    return null;
                }
            }
        }


        //当用户未登录,或者角色不是管理员时  => 阻止网关转发
        //终止运行
        requestContext.setSendZuulResponse(false);
        //为响应添加ContentType头,保证返回的响应内容(中文)可以浏览
        requestContext.getResponse().setContentType("text/html;charset=UTF-8");
        //指定返回响应的状态码
        requestContext.setResponseStatusCode(401);
        //指定响应内容
        requestContext.setResponseBody("没有权限,no privilege!");

        return null;
    }
}
